package com.leetcode.array.smallestlength.demo1;

/**
 * @Author Zan
 * @Create 2024/5/8 12:15
 * @ClassName: Test
 * @Description : https://leetcode.cn/problems/minimum-size-subarray-sum/description/  长度最小的子数组
 */
public class Test {
    public static void main(String[] args) {

    }
}

// 暴力求解法，但是leetcode改了，跑不过了，时间会超
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int size = nums.length;
        int result = Integer.MAX_VALUE; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < size; i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < size; j++) { // 设置子序列终止位置为j
                sum += nums[j];
                if (sum >= target) { // 一旦发现子序列和超过了target，更新result
                    subLength = j - i + 1; // 取子序列的长度
                    if (result > subLength) {
                        result = subLength;
                        break; // 因为我们是找符合条件最短的子序列，所以一旦符合条件就break
                    }
                }
            }
        }
        // 如果result没有被赋值的话，就返回0，说明没有符合条件的子序列
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

// 滑动窗口
class Solution2 {
    public int minSubArrayLen(int target, int[] nums) {
        int start = 0;
        int size = nums.length;
        int sum = 0;
        int result = Integer.MAX_VALUE;
        for (int end = 0; end < size; end++) {
            sum += nums[end];
            while (sum >= target) {
                result = Math.min(result, end - start + 1);
//                if (result > (end - start + 1)) {
//                    result = end - start + 1;
//                }
                sum = sum - nums[start++]; // sum不能归零，因为只有一个for循环，不会回来的，所以sum值只能拿来减
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}